//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "pv.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

PV::PV(GLfloat x, GLfloat y, bool v){

        this->x=x;
        this->y=y;
        this->esVector=v;


}
PV* PV::copiar(){
        return new PV(this->x,this->y,this->esVector);

}

bool PV::igual(PV * p){
  if((this->x==p->getX()) && (this->y==p->getY())&& (this->esVector==p->getV()))
    return true;
  return false;

}
void PV::vectorDosPV(PV *p1, PV *p2){
        this->x=p2->x-p1->x;
        this->y=p2->y-p1->y;


}

PV* PV::suma2(PV *v1, PV *v2){
    PV *v=new PV(0,0,1);
    v->setX(v1->getX()+v2->getX());
    v->setY(v1->getY()+v2->getY());
    return v;


}
void PV::suma(PV *v1, PV *v2){
    this->setX(v1->getX()+v2->getX());
    this->setY(v1->getY()+v2->getY());

}
PV *PV::resta(PV* v1, PV* v2){
    PV *v=new PV(0,0,0);
    v->setX(v1->getX()-v2->getX());
    v->setY(v1->getY()-v2->getY());
    return v;

}
PV *PV::escalacion(GLfloat a, PV* v){
    PV *v1=new PV(0,0,1);
    v1->setX(v->getX()*a);
    v1->setY(v->getY()*a);
    return v1;

}
PV *PV::normalizacion(PV* v){
    PV *v1=new PV(0,0,1);
    GLfloat m=0;
    m=sqrt(pow(v->getX(),2)+pow(v->getY(),2));
    if (m!=0){
        m=1/m;
        v1->setX(v->getX()*m);
        v1->setY(v->getY()*m);
    }
    return v1;
}
GLfloat PV::prodEscalar(PV *v1, PV *v2){
        return v1->getX()*v2->getX()+v1->getY()*v2->getY();
}


GLfloat PV::angulo(PV *v1, PV *v2){
      return acos(prodEscalar(v1,v2)/(v1->modulo()*v2->modulo()));

}
GLfloat PV::modulo(){
        return sqrt( pow(x,2)+pow(y,2) );

}


//---------------------------------------------------------------------------
bool  PV::guarda(ofstream & Archivo){
     //x
           //Archivo.write((char*) & x,sizeof(GLfloat));

     //y
           //Archivo.write((char*) & y,sizeof(GLfloat));
     //esvector
           //Archivo.write((char*) & esVector,sizeof(bool));

     Archivo << x << " " << y << " " << esVector << endl;


     return Archivo.good();
}
//---------------------------------------------------------------------------
bool  PV::abre(ifstream & Archivo){

     Archivo >> x >> y >> esVector;
           
     return Archivo.good();
}

void PV::rotaP(PV* centroRot, float ang){
        float cx= centroRot->getX();
        float cy= centroRot->getY();
        float dx=(1.0-cos(ang))*cx + sin(ang)*cy;
        float dy=-sin(ang)*cx + (1.0-cos(ang))*cy;
        float x1= x*cos(ang)-y*sin(ang)+dx;
        float y1= x*sin(ang)+y*cos(ang)+dy;
        x=x1;
        y=y1;
}
